這兩天內容會根據實際的專案架構和環境切分來說明,這些都只是我個人的使用方法,不代表適用所有datapipeline 專案,如果有更好的方式和工具也可以推薦給我~
{Data Pipeline MVP}
├── Dockerfile
├── Makefile
├── buildspec_deploy.yml
├── buildspec_test.yml
├── dags
│ └── simple_task_group.py
├── dbt
│ └── jaffle_shop
│ │ └── .sqlfluff
├── docker-compose.override.yml
├── docker-compose.yaml
├── fabfile.py
├── logs
├── plugins
├── requirements.txt
├── ruff.toml
├── tests
│ ├── dags
│ └── data
└── venv
Dockerfile
: 定義了用在建立 Airflow 容器 Image 的內容。Makefile
: 用於簡化常用指令,例如建立環境、測試、部署等。buildspec_deploy.yml
和 buildspec_test.yml
: 這些是用於 CI/CD 當中 AWS CodeBuild 的設定,分別用於部署和測試流程。dags/
: 存放 Airflow DAG 文件的目錄dbt/
: 包含 dbt 專案文件。jaffle_shop 就是是之前示範的 dbt 專案,代表可以同時管理多個 dbt 專案。docker-compose.override.yml
和 docker-compose.yaml
: Docker Compose 設定文件,用於定義和管理多容器 Docker 應用。fabfile.py
: Fabric 模組的設定 py 檔,用於自動化部署和管理任務。logs/
: 儲存 Airflow 紀錄的目錄。plugins/
: 用於存放自定義 Airflow 插件的目錄。requirements.txt
: 列出專案的 Python 所需模組。ruff.toml
: Python linter Ruff 的設定文件。tests/
: 包含測試文件的目錄,分為 DAG 測試和數據測試。venv/
: Python 虛擬環境目錄,用於執行測試專案。.env
區分環境變數將 docker environment 的參數搬到 .env
,方便後續可以區分 local
、dev
、staging
、production
、main
做區分,到底要分為幾個環境和設定,主要依照各團隊不同的開發流程和習慣,通常最基本會有兩個,至少不太可能直接在 server
上開發吧~
# Airflow Core
AIRFLOW__CORE__FERNET_KEY=''
AIRFLOW__CORE__EXECUTOR=CeleryExecutor
AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION=True
AIRFLOW__CORE__LOAD_EXAMPLES=False
AIRFLOW_UID=50000
AIRFLOW_GID=0
# Airflow Metadata DB
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres/airflow
AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://airflow:airflow@postgres/airflow
AIRFLOW__API__AUTH_BACKENDS=airflow.api.auth.backend.basic_auth,airflow.api.auth.backend.session
AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0
AIRFLOW__SCHEDULER__ENABLE_HEALTH_CHECK=True
# Airflow Init
_AIRFLOW_DB_MIGRATE=True
_AIRFLOW_WWW_USER_CREATE=True
_AIRFLOW_WWW_USER_USERNAME=airflow
_AIRFLOW_WWW_USER_PASSWORD=airflow
# Airflow Connection
AIRFLOW_CONN_AIRFLOW_METADATA_DB=postgresql+psycopg2://airflow:airflow@postgres:5432/airflow
# Airflow Worker
DUMB_INIT_SETSID=0
# Airflow Cli
CONNECTION_CHECK_MAX_COUNT=0
# dbt
DBT_THREADS=1
DBT_HOST=localhost
DBT_POST=5432
DBT_USER=airflow
DBT_PWD=airflow
DBT_DBNAME=airflow
DBT_SCHEMA=dbt
上方大部分都是本來 docker-compose.yml
的設定,比較特別需要注意的有兩個地方,# Airflow Connection
和 #dbt
區塊:
# Airflow Connection
:設定之後可以不用到 Web UI 設定就能連接,服務清空重啟也不用重新設定連接,設定方式就是將之後要用的 conn_id
放在 AIRFLOW_CONN
後面,像是這樣AIRFLOW_CONN_{conn_id}
#dbt
:將在 profile.yml
使用的內容另外放到環境變數,本地、測試、正式就可以直接加在 .env
當中,而且要記得 profile.yml
要修改成下方:airflow_db:
outputs:
dev:
type: postgres
threads: '{{env_var("DBT_THREADS")}}'
host: '{{env_var("DBT_HOST")}}'
port: '{{env_var("DBT_POST")}}'
user: '{{env_var("DBT_USER")}}'
pass: '{{env_var("DBT_PWD")}}'
dbname: '{{env_var("DBT_DBNAME")}}'
schema: '{{env_var("DBT_SCHEMA")}}'
target: dev
之前將
'{{env_var("DBT_SCHEMA")}}'
的寫法改成"{{env_var('DBT_SCHEMA')}"
,結果竟然就會無法抓到,到現在還是很困惑,是原始碼雙引號和單引號不通用嗎、還是分析樹沒寫好
docker-compose.override.yml
區分環境服務docker override 可以當作是 docker-compose.yml
的擴充,所以通常會設定基本的基礎服務在 docker-compose.yml
,另外在將每個環境需要的服務或設定放到 docker-compose.override.yml
,範例程式碼如下:
version: "3.9"
x-airflow-common:
depends_on: &airflow-common-depends-on
redis:
condition: service_healthy
postgres:
condition: service_healthy
services:
postgres:
image: postgres:13
environment:
POSTGRES_USER: airflow
POSTGRES_PASSWORD: airflow
POSTGRES_DB: airflow
volumes:
- postgres-db-volume:/var/lib/postgresql/data
ports:
- "5432:5432"
healthcheck:
test: ["CMD", "pg_isready", "-U", "airflow"]
interval: 10s
retries: 5
start_period: 5s
restart: always
airflow-webserver:
ports:
- "8080:8080"
volumes:
mysql-db-volume:
docker-compose.override.yml
文件主要是為了覆寫或擴展 docker-compose.yml
文件中的設定,因為遠端 server 通常會連接到另外開的 metadata db,所以在本地端的測試才需要另外開啟 Postgres 服務,或是如果 server
上的 8080
已經開別的服務的話,也可以用 docker-compose.override.yml
來覆蓋原來開的 port
docker-compose.yml
修改範例基本上就是所有的 environment
區塊都改成 env_file
environment:
&airflow-common-env
...
↓
env_file:
- .env
需要修改的有四個區塊 x-airflow-common
、airflow-worker
、airflow-init
、airflow-cli
x-airflow-common:
&airflow-common
build:
context: .
env_file:
- .env
airflow-worker:
env_file:
- .env
airflow-init:
env_file:
- .env
airflow-cli:
env_file:
- .env
詳細的內容可以參考這個檔案
明天會繼續說明剩下的設定,主要是 CI/CD 的相關設定~